package co.edu.uniandes.ecos.itera.tsp.mundo;

import co.edu.uniandes.ecos.itera.tsp.anotaciones.Avance;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.Avances;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.Loc;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.LogT;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
//import java.util.Date;

/**
 * Representa a un Ciclo de TSP que se trabaja para un Proyecto
 */
@Avances({
	@Avance(taskId=6, termino='S'),
	@Avance(taskId=16, termino='S')
})
@LogT(date="2011-03-13", min=9, taskId=6)
public class Ciclo implements Serializable
{
	/**
	 * Identifica como unico a este objeto
	 */
	private static final long serialVersionUID = -3070788115933775877L;

	/**
	 * Listado de Tareas a trabajar en este Ciclo
	 */
	private List<Tarea> tareas;
	
	/**
	 * Numero del Ciclo TSP de este Proyecto
	 */
	private int numeroCiclo;
	
	/**
	 * Fecha de Inicio de este Ciclo
	 */
	private Date fechaInicio;
	
	/**
	 * Fecha de finalizacion de este ciclo
	 */
	private Date fechaFin;
	
	/**
	 * Identifica al Plan de Calidad de este Proyecto
	 */
	private ArrayList<PlanCalidad> planCalidad;
	
	/**
	 * Identifica el Plan de Producto de este Proyecto
	 */
	private PlanProducto planProducto;
	
	/**
	 * Constructor por defecto
	 */
	public Ciclo()
	{
		this.tareas = new ArrayList<Tarea>();
	}

	
	
	/**
	 * Establece el Numero del Ciclo TSP de este Proyecto
	 * @param numeroCiclo Numero del Ciclo TSP de este Proyecto
	 */
	@Loc(size=1, taskId=6)
	public void setNumeroCiclo(int numeroCiclo) 
	{
		this.numeroCiclo = numeroCiclo;
	}

	/**
	 * Consulta el Numero del Ciclo TSP de este Proyecto
	 * @return Numero del Ciclo TSP de este Proyecto
	 */
	@Loc(size=1, taskId=6)
	public int getNumeroCiclo() 
	{
		return numeroCiclo;
	}

	/**
	 * Establece la Fecha de Inicio de este Ciclo
	 * @param fechaInicio Fecha de Inicio de este Ciclo
	 */
	@Loc(size=1, taskId=6)
	public void setFechaInicio(Date fechaInicio) 
	{
		this.fechaInicio = fechaInicio;
	}

	/**
	 * Consula la Fecha de Inicio de este Ciclo
	 * @return Fecha de Inicio de este Ciclo
	 */
	@Loc(size=1, taskId=6)
	public Date getFechaInicio() 
	{
		return fechaInicio;
	}

	/**
	 * Establece la Fecha de finalizacion de este ciclo
	 * @param fechaFin Fecha de finalizacion de este ciclo
	 */
	@Loc(size=1, taskId=6)
	public void setFechaFin(Date fechaFin) 
	{
		this.fechaFin = fechaFin;
	}

	/**
	 * Consula la Fecha de finalizacion de este ciclo
	 * @return Fecha de finalizacion de este ciclo
	 */
	@Loc(size=1, taskId=6)
	public Date getFechaFin() 
	{
		return fechaFin;
	}
	
	/**
	 * Agrega una tarea a las tareas de este Ciclo
	 * @param tarea
	 */
	@Loc(size=1, taskId=6)
	public void agregarTarea(Tarea tarea)
	{
		this.tareas.add(tarea);
	}
	
	/**
	 * Lista las tareas del Ciclo
	 * @return
	 */
	@Loc(size=1, taskId=6)
	public List<Tarea> listarTareas()
	{
		return this.tareas;
	}
	
	/**
	 * Establece el Plan de Calidad de este Proyecto
	 * @param planCalidad Plan de Calidad de este Proyecto
	 */
	@Loc(size=1, taskId=6)
	public void setPlanCalidad(ArrayList<PlanCalidad> planCalidad) 
	{
		this.planCalidad = planCalidad;
	}

	/**
	 * Consula el Plan de Calidad de este Proyecto
	 * @return Plan de Calidad de este Proyecto
	 */
	@Loc(size=1, taskId=6)
	public ArrayList<PlanCalidad> getPlanCalidad() 
	{
		return planCalidad;
	}

	/**
	 * Establece el Producto de este Proyecto
	 * @param planProducto Producto de este Proyecto
	 */
	@Loc(size=1, taskId=6)
	public void setPlanProducto(PlanProducto planProducto)
	{
		this.planProducto = planProducto;
	}

	/**
	 * Consula el Producto de este Proyecto
	 * @return Producto de este Proyecto
	 */
	@Loc(size=1, taskId=6)
	public PlanProducto getPlanProducto() 
	{
		return planProducto;
	}
	
	@Override
	public String toString()
	{
		return String.format("Ciclo %d", this.numeroCiclo);
	}
	
}
